﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GestionManoDeObra.BusinessLogic;
using GestionManoDeObra.BusinessEntity;
using GestionManoDeObra.Consulta;
using GestionManoDeObra.WebSite.Models;

namespace GestionManoDeObra.WebSite.Controllers
{
    public class ImplementoController : Controller
    {

        public ActionResult Index()
        {
            ImplementoTrabajadorBL implementoTrabajadorBL = new ImplementoTrabajadorBL();
            IList<ImplementosPrestados> implementosPrestados = implementoTrabajadorBL.ObtenerImplementosPrestados();
            implementoTrabajadorBL = null;

            return View(implementosPrestados);
        }

        public ActionResult Devolver(int IdImplementoTrabajador)
        {
            ImplementoTrabajadorBL implementoTrabajadorBL = new ImplementoTrabajadorBL();
            ImplementoTrabajador implementoTrabajador = implementoTrabajadorBL.Obtener(IdImplementoTrabajador);
            implementoTrabajadorBL = null;
            ViewBag.NumeroOrden = implementoTrabajador.NumeroOrden;

            ControlPersonalBL controlPersonalBL = new ControlPersonalBL();
            EmpresaBL empresaBL = new EmpresaBL();
            Trabajador trabajador = controlPersonalBL.ObtenerTrabajador(implementoTrabajador.IdTrabajador);
            Empresa empresa = empresaBL.Obtener(trabajador.IdEmpresa);

            controlPersonalBL = null;
            empresaBL = null;

            ViewBag.empresaNombre = empresa.Nombre;

            ImplementoTrabajadorDetalleBL implementoTrabajadorDetalle = new ImplementoTrabajadorDetalleBL();
            IList<ImplementoCarrito> implementosPrestados = implementoTrabajadorDetalle.ObtenerDetallePrestados(implementoTrabajador.IdImplementoTrabajador);
            IList<ImplementoCarrito> implementosDevueltos = implementoTrabajadorDetalle.ObtenerDetalleDevueltos(implementoTrabajador.IdImplementoTrabajador);

            ViewBag.implementosPrestados = implementosPrestados;
            ViewBag.implementosDevueltos = implementosDevueltos;

            implementoTrabajadorDetalle = null;

            CargarCarritosDevolver(implementoTrabajador.IdImplementoTrabajador);

            return View(trabajador);
        }

        [HttpPost]
        public ActionResult Devolver()
        {
            ImplementoTrabajadorBL implementoTrabajadorBL = new ImplementoTrabajadorBL();
            ImplementoTrabajadorDetalleBL implementoTrabajadorDetalleBL = new ImplementoTrabajadorDetalleBL();
            
            IList<ImplementoCarrito> detalle = new List<ImplementoCarrito>();

            detalle = (List<ImplementoCarrito>)Session[sessionImplementosDevueltos];

            implementoTrabajadorDetalleBL.DevolverDetalle(detalle);

            IList<ImplementosPrestados> implementosPrestados = implementoTrabajadorBL.ObtenerImplementosPrestados();

            implementoTrabajadorBL = null;
            implementoTrabajadorDetalleBL = null;
            
            return View("Index", implementosPrestados);
        }

        private const string sessionImplementosDisponibles = "sessionImplementosDisponibles";
        private const string sessionImplementosAsignados = "sessionImplementosAsignados";

        private const string sessionImplementosPrestados = "sessionImplementosPrestados";
        private const string sessionImplementosDevueltos = "sessionImplementosDevueltos";

        public ActionResult Nuevo()
        {
            Session.Remove(sessionImplementosDisponibles);
            Session.Remove(sessionImplementosAsignados);

            IList<ImplementoCarrito> listaImplementosDisponibles = new List<ImplementoCarrito>();
            IList<ImplementoCarrito> listaImplementosAsignados = new List<ImplementoCarrito>();

            Session.Add(sessionImplementosDisponibles, listaImplementosDisponibles);
            Session.Add(sessionImplementosAsignados, listaImplementosAsignados);

            return View();
        }

        private void CargarCarritosDevolver(int IdImplementoTrabajador) {
            ImplementoTrabajadorDetalleBL implementoTrabajadorDetalleBL = new ImplementoTrabajadorDetalleBL();

            Session.Remove(sessionImplementosPrestados);
            Session.Remove(sessionImplementosDevueltos);

            IList<ImplementoCarrito> listaImplementosPrestados = implementoTrabajadorDetalleBL.ObtenerDetallePrestados(IdImplementoTrabajador);
            IList<ImplementoCarrito> listaImplementosDevueltos = implementoTrabajadorDetalleBL.ObtenerDetalleDevueltos(IdImplementoTrabajador);

            Session.Add(sessionImplementosPrestados, listaImplementosPrestados);
            Session.Add(sessionImplementosDevueltos, listaImplementosDevueltos);

            implementoTrabajadorDetalleBL = null;
        }

        [HttpPost]
        //se cambio a ActionResult en lugar de void por el redirect
        public ActionResult Prestar(Cabecera cabecera)
        {
            ImplementoTrabajadorBL implementoTrabajadorBL = new ImplementoTrabajadorBL();
            ImplementoTrabajadorDetalleBL implementoTrabajadorDetalleBL = new ImplementoTrabajadorDetalleBL();
            ImplementoTrabajador implementoTrabajador = new ImplementoTrabajador();
            IList<ImplementoCarrito> detalle = new List<ImplementoCarrito>();
            int IdImplementoTrabajador;

            string NumeroOrden = Request["txtOrden"];
            int Id = Convert.ToInt32(Request["txtId"]);

            implementoTrabajador.IdTrabajador = Id;
            implementoTrabajador.NumeroOrden = NumeroOrden;
            implementoTrabajador.Fecha = DateTime.Now;
            implementoTrabajador.Hora = DateTime.Now;

            IdImplementoTrabajador = implementoTrabajadorBL.Crear(implementoTrabajador);

            detalle = (List<ImplementoCarrito>)Session[sessionImplementosAsignados];
            implementoTrabajadorDetalleBL.CrearDetalle(IdImplementoTrabajador, detalle);

            implementoTrabajador = null;

            //RedirectToAction("Index", "Implemento"); 
            //ImplementoTrabajadorBL implementoTrabajadorBL = new ImplementoTrabajadorBL();
            IList<ImplementosPrestados> implementosPrestados = implementoTrabajadorBL.ObtenerImplementosPrestados();
            implementoTrabajadorBL = null;

            return View("Index", implementosPrestados);

        }

        [HttpPost]
        public ActionResult AgregarImplemento(int IdCategoriaImplemento){
            IList<ImplementoCarrito> listaImplementosAsignados = (List<ImplementoCarrito>)Session[sessionImplementosAsignados];
            IList<ImplementoCarrito> listaImplementosAsignadosAuxiliar = new List<ImplementoCarrito>();
            IList<ImplementoCarrito> listaImplementosDisponibles = (List<ImplementoCarrito>)Session[sessionImplementosDisponibles];
            ImplementoCarrito implementoCarrito = null;
            int correlativo = 0;

            foreach (ImplementoCarrito item in listaImplementosDisponibles)
            {
                if (item.IdCategoriaImplemento == IdCategoriaImplemento)
                {
                    implementoCarrito = item;
                    break;
                }
            }

            listaImplementosAsignados.Add(implementoCarrito);
            listaImplementosDisponibles.Remove(implementoCarrito);

            foreach (ImplementoCarrito item in listaImplementosAsignados)
            {
                correlativo++;
                implementoCarrito = new ImplementoCarrito();
                implementoCarrito.Correlativo = correlativo;
                implementoCarrito.DivId = "asignado" + Convert.ToString(item.IdCategoriaImplemento);
                implementoCarrito.NombreCategoria = item.NombreCategoria;
                implementoCarrito.IdCategoriaImplemento = item.IdCategoriaImplemento;
                listaImplementosAsignadosAuxiliar.Add(implementoCarrito);
            }
            listaImplementosAsignados = listaImplementosAsignadosAuxiliar;

            Session.Add(sessionImplementosAsignados, listaImplementosAsignados);
            Session.Add(sessionImplementosDisponibles, listaImplementosDisponibles);

            return PartialView("ImplementosAsignados", listaImplementosAsignados);
        }

        [HttpPost]
        public ActionResult RetirarImplemento(int IdCategoriaImplemento)
        {
            IList<ImplementoCarrito> listaImplementosDisponibles = (List<ImplementoCarrito>)Session[sessionImplementosDisponibles];
            IList<ImplementoCarrito> listaImplementosDisponiblesAuxiliar = new List<ImplementoCarrito>();
            IList<ImplementoCarrito> listaImplementosAsignados = (List<ImplementoCarrito>)Session[sessionImplementosAsignados];
            ImplementoCarrito implementoCarrito = null;
            int correlativo = 0;
            foreach (ImplementoCarrito item in listaImplementosAsignados)
            {
                if (item.IdCategoriaImplemento == IdCategoriaImplemento)
                {
                    implementoCarrito = item;
                    break;
                }
            }

            listaImplementosDisponibles.Add(implementoCarrito);
            listaImplementosAsignados.Remove(implementoCarrito);

            foreach (ImplementoCarrito item in listaImplementosDisponibles)
            {
                correlativo++;
                implementoCarrito = new ImplementoCarrito();
                implementoCarrito.Correlativo = correlativo;
                implementoCarrito.DivId = "disponible" + Convert.ToString(item.IdCategoriaImplemento);
                implementoCarrito.NombreCategoria = item.NombreCategoria;
                implementoCarrito.IdCategoriaImplemento = item.IdCategoriaImplemento;                
                listaImplementosDisponiblesAuxiliar.Add(implementoCarrito);
            }
            listaImplementosDisponibles = listaImplementosDisponiblesAuxiliar;

            Session.Add(sessionImplementosDisponibles, listaImplementosDisponibles);
            Session.Add(sessionImplementosAsignados, listaImplementosAsignados);

            return PartialView("ImplementosDisponibles", listaImplementosDisponibles);
        }

        [HttpPost]
        public ActionResult ImplementosDisponibles()
        {
            CategoriaImplementoBL categoriaImplementoBL = new CategoriaImplementoBL();
            IList<ImplementoCarrito> listaImplementosDisponibles = categoriaImplementoBL.ObtenerCategoriasDisponibles();
            categoriaImplementoBL = null;

            Session.Add(sessionImplementosDisponibles, listaImplementosDisponibles);

            return PartialView("ImplementosDisponibles", listaImplementosDisponibles);
        }

        [HttpPost]
        public ActionResult ImplementosAsignadosVacio()
        {
            return PartialView("ImplementosAsignadosVacio");
        }

        [HttpPost]
        public ActionResult ImplementosDisponiblesVacio()
        {
            return PartialView("ImplementosDisponiblesVacio");
        }

        public ActionResult ObtenerCantidadItems()
        { 
            IList<ImplementoCarrito> listaImplementosAsignados = (List<ImplementoCarrito>)Session[sessionImplementosAsignados];
            int cantidad = listaImplementosAsignados.Count();
            return Json(new { cantidadItems = cantidad }, JsonRequestBehavior.AllowGet);
        }



        public ActionResult ObtenerTrabajador(int IdTrabajador)
        {
            ControlPersonalBL controlPersonalBL = new ControlPersonalBL();
            EmpresaBL empresaBL = new EmpresaBL();
            Trabajador trabajador = controlPersonalBL.ObtenerTrabajador(IdTrabajador);

            if (trabajador != null)
            {
                Empresa empresa = empresaBL.Obtener(trabajador.IdEmpresa);
                controlPersonalBL = null;
                empresaBL = null;

                return Json(new
                {
                    idtrabajador = trabajador.IdTrabajador,
                    nombre = trabajador.Nombre,
                    apellido = trabajador.Apellido,
                    dni = trabajador.DNI,
                    edad = trabajador.Edad,
                    empresa = empresa.Nombre
                },
                        JsonRequestBehavior.AllowGet
                    );
            }
            else { 
                return Json(new
                {
                    idtrabajador = -1,
                    nombre = "",
                    apellido = "",
                    dni = "",
                    edad = "",
                    empresa = ""
                },JsonRequestBehavior.AllowGet
                    );
            }
        }

        [HttpPost]
        public ActionResult DevolverImplemento(int IdImplementoTrabajadorDetalle)
        {
            IList<ImplementoCarrito> listaImplementosDevueltos = (List<ImplementoCarrito>)Session[sessionImplementosDevueltos];
            IList<ImplementoCarrito> listaImplementosDevueltosAuxiliar = new List<ImplementoCarrito>();
            IList<ImplementoCarrito> listaImplementosPrestados = (List<ImplementoCarrito>)Session[sessionImplementosPrestados];
            ImplementoCarrito implementoCarrito = null;
            int correlativo = 0;

            foreach (ImplementoCarrito item in listaImplementosPrestados)
            {
                if (item.IdImplementoTrabajadorDetalle == IdImplementoTrabajadorDetalle)
                {
                    implementoCarrito = item;
                    break;
                }
            }

            listaImplementosDevueltos.Add(implementoCarrito);
            listaImplementosPrestados.Remove(implementoCarrito);

            foreach (ImplementoCarrito item in listaImplementosDevueltos)
            {
                correlativo++;
                implementoCarrito = new ImplementoCarrito();
                implementoCarrito.Correlativo = correlativo;
                implementoCarrito.DivId = "devuelto" + Convert.ToString(item.IdImplementoTrabajadorDetalle);
                implementoCarrito.NombreCategoria = item.NombreCategoria;
                implementoCarrito.IdCategoriaImplemento = item.IdCategoriaImplemento;
                implementoCarrito.IdImplementoTrabajadorDetalle = item.IdImplementoTrabajadorDetalle;
                implementoCarrito.IdImplemento = item.IdImplemento;
                implementoCarrito.Estado = item.Estado;
                listaImplementosDevueltosAuxiliar.Add(implementoCarrito);
            }
            listaImplementosDevueltos = listaImplementosDevueltosAuxiliar;

            Session.Add(sessionImplementosDevueltos, listaImplementosDevueltos);
            Session.Add(sessionImplementosPrestados, listaImplementosPrestados);

            return PartialView("ImplementosDevDevueltos", listaImplementosDevueltos);
        }

        [HttpPost]
        public ActionResult CancelarDevolucionImplemento(int IdImplementoTrabajadorDetalle)
        {
            IList<ImplementoCarrito> listaImplementosPrestados = (List<ImplementoCarrito>)Session[sessionImplementosPrestados];
            IList<ImplementoCarrito> listaImplementosPrestadosAuxiliar = new List<ImplementoCarrito>();
            IList<ImplementoCarrito> listaImplementosDevueltos = (List<ImplementoCarrito>)Session[sessionImplementosDevueltos];
            ImplementoCarrito implementoCarrito = null;
            int correlativo = 0;

            foreach (ImplementoCarrito item in listaImplementosDevueltos)
            {
                if (item.IdImplementoTrabajadorDetalle == IdImplementoTrabajadorDetalle)
                {
                    implementoCarrito = item;
                    break;
                }
            }

            listaImplementosPrestados.Add(implementoCarrito);
            listaImplementosDevueltos.Remove(implementoCarrito);

            foreach (ImplementoCarrito item in listaImplementosPrestados)
            {
                correlativo++;
                implementoCarrito = new ImplementoCarrito();
                implementoCarrito.Correlativo = correlativo;
                implementoCarrito.DivId = "prestado" + Convert.ToString(item.IdImplementoTrabajadorDetalle);
                implementoCarrito.NombreCategoria = item.NombreCategoria;
                implementoCarrito.IdCategoriaImplemento = item.IdCategoriaImplemento;
                implementoCarrito.IdImplementoTrabajadorDetalle = item.IdImplementoTrabajadorDetalle;
                implementoCarrito.IdImplemento = item.IdImplemento;
                implementoCarrito.Estado = item.Estado;
                listaImplementosPrestadosAuxiliar.Add(implementoCarrito);
            }
            listaImplementosPrestados = listaImplementosPrestadosAuxiliar;

            Session.Add(sessionImplementosDevueltos, listaImplementosDevueltos);
            Session.Add(sessionImplementosPrestados, listaImplementosPrestados);

            return PartialView("ImplementosDevPrestados", listaImplementosPrestados);
        }

    }
}
